// 引入unocss css
import '@/plugins/unocss'
// 导入全局的svg图标
import '@/plugins/svgIcon'
// 初始化多语言
import { setupI18n } from '@/plugins/vueI18n'
// 引入状态管理
import { setupStore } from '@/store'
// 全局组件
import { setupGlobCom } from '@/components'
// 引入 element-plus
import { setupElementPlus } from '@/plugins/elementPlus'
// 引入全局样式
import '@/styles/index.scss'
// 引入动画
import '@/plugins/animate.css'
// 路由
import router, { setupRouter } from '@/router'
// 权限
import { setupAuth } from '@/directives'
import { createApp } from 'vue'
import App from './App.vue'
import './permission'
import Logger from '@/utils/Logger'
import VueDOMPurifyHTML from 'vue-dompurify-html' // 解决v-html 的安全隐患
import { WapPortalConfig } from './wap'
import { CommonQianKunEnum } from './utils/constants'
import renderWithQiankun, { qiankunWindow } from 'vite-plugin-qiankun/es/helper'
import { setMessageSubject } from './utils/sub-rxjs-util'
import { useCache } from './hooks/web/useCache'

let app
async function render(props: WapPortalConfig) {
  // 从props中解构属性
  const {
    appIdentity,
    baseRoutePrefix,
    // menuHeight,
    containers: { app: container }
  } = props

  if (!container) {
    return
  }
  app = createApp(App)
  await setupI18n(app)
  setupStore(app)
  setupGlobCom(app)
  setupElementPlus(app)
  setupRouter(app, { baseRouterPrefix: baseRoutePrefix })
  setupAuth(app)
  await router.isReady()
  console.log(router.getRoutes())
  app.use(VueDOMPurifyHTML)
  // 根据应用参数配置localStorage数据库信息
  setMessageSubject(props.messageSubject)
  app.mount(container ? container : '#app')
  Logger.prettyPrimary(`欢迎使用`, import.meta.env.VITE_APP_TITLE)
}
/**
 * bootstrap 只会在微应用初始化的时候调用一次，下次微应用重新进入时会直接调用 mount 钩子，不会再重复触发 bootstrap。
 * 通常我们可以在这里做一些全局变量的初始化，比如不会在 unmount 阶段被销毁的应用级别的缓存等。
 */
export async function bootstrap() {
  Logger.prettyPrimary(`子应用进入 bootstrap 方法`)
}
function beforeRender(props: WapPortalConfig) {
  const { baseRoutePrefix, user } = props
  if (user) {
    const { wsCache } = useCache()
    wsCache.set(CommonQianKunEnum.BASER_ROUTE_PREFIX, baseRoutePrefix)
  }
}
/**
 * 应用每次进入都会调用 mount 方法，通常我们在这里触发应用的渲染方法
 */
export async function mount(props: WapPortalConfig) {
  Logger.prettyPrimary(`子应用进入 mount 方法`, props)
  beforeRender(props)
  render(props)
}

/**
 * 应用每次 切出/卸载 会调用的方法，通常在这里我们会卸载微应用的应用实例
 */
export function unmount(props: WapPortalConfig) {
  Logger.prettyPrimary(`子应用进入 unmounted 方法`, props)
  if (app) {
    app.unmount()
  }
}

/**
 * 可选生命周期钩子，仅使用 loadMicroApp 方式加载微应用时生效
 * 当基座中传入的数据值有变化时会被调用,可以在这个方法中实时更新最新数据数据
 */
export async function update(props: WapPortalConfig) {
  console.log(props)
  // 从props中解构属性
  const { user } = props
  app.config.globalProperties.user = user
}

renderWithQiankun({ mount, bootstrap, unmount, update })

if (!qiankunWindow.__POWERED_BY_QIANKUN__) {
  Logger.prettyPrimary(`欢迎使用`, 'render without qiankun')
  render({
    containers: { app: '#app' },
    appIdentity: 'dw',
    baseRoutePrefix: '/'
  })
} else {
  Logger.prettyPrimary(`欢迎使用`, 'render qiankun')
}
